package com.ychs.lawyerback.controller;

import com.ychs.lawyerback.annotation.RequiredPermission;
import com.ychs.lawyerback.common.R;
import com.ychs.lawyerback.common.ResultCode;
import com.ychs.lawyerback.dto.DocumentQueryDTO;
import com.ychs.lawyerback.exception.BussinessException;
import com.ychs.lawyerback.pojo.DocumentEntity;
import com.ychs.lawyerback.service.DocumentService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.UUID;


/**
 * @author qiumengyao
 * @version 1.0
 * @date 2025/8/15
 */


/**
 * 基本信息与依赖的注入
 */
@RestController
@RequestMapping("/api/submissions")
public class DocumentController {


    /**
     * 将DocumentService接口的实现类对象自动注入到当前控制器中，无需手动创建实例，实现了控制层与服务层的解耦
     * DocumentService：是业务逻辑层接口，包含文件上传、状态更新、查询等核心业务方法
     */

    @Autowired
    private DocumentService documentService;

    /**
     * 文件上传接口（核心功能）
     * @return
     * @PostMapping：处理HTTP POST请求，路径为基础路径`/api/submissions`（无额外路径）。
     * @RequestParam：指定前端上传的文件参数名，与前端表单的`name`属性对应
     */
    @PostMapping
    public R<?> uploadDocument(
            @RequestParam("formFile") MultipartFile formFile,//表单主文件
            @RequestParam("documents[身份证]") MultipartFile idCardFile,//身份证文件
            @RequestParam("documents[毕业证]") MultipartFile graduationFile,//毕业证
            @RequestParam("documents[律师执业证]") MultipartFile lawyerLicenseFile,
            @RequestParam("uploadName") String uploadName) {

        try {
            // 生成临时标识（关联同一批次上传的所有文件）
//            String tempId = UUID.randomUUID().toString().replace("-", "");

            //分别上传不同类型的文件
            // 处理表单文件（类型4）
            documentService.uploadDocument(new MultipartFile[]{formFile}, 4,uploadName);
            // 处理身份证（类型2）
            documentService.uploadDocument(new MultipartFile[]{idCardFile}, 2,uploadName);
            // 处理毕业证（类型3）
            documentService.uploadDocument(new MultipartFile[]{graduationFile}, 3,uploadName);
            // 处理律师执业证（类型5）
            documentService.uploadDocument( new MultipartFile[]{lawyerLicenseFile}, 5,uploadName);

            return R.success("提交成功，等待审核");
        } catch (Exception e) {
            return R.fail(ResultCode.FILE_UPLOAD_ERROR);
        }

    }
    /**
     * 获取待审核列表
     * 查询所有状态为待审核的文件提交记录
     */
    @GetMapping("/pending")
    @RequiredPermission("system:document:pending")
    public R<?> getPendingSubmissions() {
        try {
            // 实际应该调用service层获取待审核列表
            return R.success(documentService.getPendingDocuments());
        } catch (Exception e) {
            return R.fail(ResultCode.SYSTEM_ERROR);
        }
    }

    /**
     * 审核通过
     * 更新文件状态为已通过
     */
    @PutMapping("/{id}/approve")
    @RequiredPermission("system:document:approve")
    public R<?> approveSubmission(@PathVariable Long id) {
        try {
            documentService.updateDocumentStatus(id, 1, null);
            return R.success("审核通过");
        } catch (BussinessException e) {
            // 添加具体错误信息
            return R.fail(e.getCode(), "审核失败：" + e.getMessage());
        } catch (Exception e) {
            return R.fail(ResultCode.OPERATION_FAILED, "审核失败：" + e.getMessage());
        }
    }

    /**
     * 审核拒绝
     * 更新文件状态为已拒绝，并保存拒绝原因
     */
    @PutMapping("/{id}/reject")
    @RequiredPermission("system:document:reject")
    public R<?> rejectSubmission(
            @PathVariable Long id,
            @RequestParam String remark) {
        try {
            documentService.updateDocumentStatus(id, 2, remark);
            return R.success("已拒绝");
        } catch (BussinessException e) {
            // 添加具体错误信息
            return R.fail(e.getCode(), "拒绝失败：" + e.getMessage());
        } catch (Exception e) {
            return R.fail(ResultCode.OPERATION_FAILED, "拒绝失败：" + e.getMessage());
        }
    }


    @GetMapping("/files/download")  // 保持路径与前端一致
    @RequiredPermission("system:document:download")
    public void downloadFile(@RequestParam String fileName, HttpServletResponse response) {  //String fileName提供一个下载的名称指定下载 参数改为fileName

        try {
            // 1. 通过文件名查询文件信息（需在service实现该方法）
            DocumentEntity doc = documentService.getDocumentByFileName(fileName);  // 新增方法：通过文件名查询
            if (doc == null) {
                response.setStatus(404);  // 文件不存在
                return;
            }

            // 2. 获取本地文件路径（从数据库记录中获取完整路径）
            String localPath = doc.getFilePath();  // 例如：E:\\day\\workspace\\...\\xxx.pdf

            // 3. 读取文件并写入响应流
            /**
             * out 是服务器向客户端发送数据的 “通道”（从服务器到客户端）；
             * in 是服务器读取本地文件数据的 “通道”（从服务器本地文件到服务器内存）。
             */
            try (InputStream in = new FileInputStream(localPath);
                 OutputStream out = response.getOutputStream()) {

                // 根据文件后缀获取MIME类型
                String contentType = Files.probeContentType(Paths.get(localPath));
                response.setContentType(contentType);
                // 处理中文文件名乱码
                String encodedFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
                if (contentType != null && contentType.startsWith("image/")) {
                    // 图片类型：在线预览
                    response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"");
                } else {
                    // 非图片类型：强制下载
                    response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
                }

                byte[] buffer = new byte[1024];
                int len;
                while ((len = in.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                out.flush();
            }
        } catch (FileNotFoundException e) {
            response.setStatus(404);  // 文件未找到
        } catch (Exception e) {
            response.setStatus(500);  // 服务器错误
        }
    }



}

